home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / drivers / bjtwin.c < prev    next >
C/C++ Source or Header  |  2000-05-04  |  15KB  |  482 lines

  1. /********************************************************************
  2.  
  3. Bombjack Twin
  4.  
  5. driver by Mirko Buffoni, Richard Bush
  6.  
  7.  
  8. Memory layout:
  9.  
  10. 000000-07FFFF    68k rom
  11. 080000-08000F    Inputs, DSW
  12. 080010-087FFF    command ram (Audio I/O)
  13. 088000-0887FF    15 bit palette ram (RRRRGGGGBBBBRGBx)
  14.                                     4321^^^^^^^^0^^
  15.                                         4321|||| 0|
  16.                                             4321  0
  17.  
  18. 094000-09CDFF    word at 94000 holds background image number
  19. 09CE00-09DDFF    Background ram    (8x8 tiles, 256x512)
  20. 0F0000-0FFFFF    Work ram
  21.  
  22. ----
  23.  
  24. 084014            Flipscreen
  25.  
  26. 0F8000-0F8FFF    Spriteram
  27.  
  28. This hardware can handle up to 256 sprites.
  29. Each sprite entry occupy 16 bytes, which meaning is:
  30.  
  31. 00-01:    != 0 -> Sprite enabled
  32. 02   :    Hi nibble = composed sprite height (in GFX units)
  33.         Lo nibble = composed sprite width (in GFX units)
  34. 06-07:    Sprite number
  35. 08-09:    Sprite x position    (lower 9 bits)
  36. 0C-0D:    Sprite y position    (lower 9 bits)
  37. 0E   :    Sprite color
  38.  
  39. ----
  40.  
  41. Audio system:  2 x OKI M6295
  42.  
  43. 084000    (RW)    OKI 1 data read/write
  44. 084010    (RW)    OKI 2 data read/write
  45.  
  46. 084020    \
  47. 084022    |    Selects Bank address for voice 0-3    (OKI 1)
  48. 084024    |
  49. 084026    /
  50.  
  51. 084028    \
  52. 08402a    |    Selects Bank address for voice 0-3    (OKI 2)
  53. 08402c    |
  54. 08402e    /
  55.  
  56. ----
  57.  
  58. IRQ1 controls audio output and coin/joysticks reads
  59. I haven't yet figured out why music stops so soon, but it's
  60. surely due to interrupt timing (the hardware is so simple!).
  61.  
  62. IRQ4 controls DSW reads and vblank.
  63. IRQ2 points to RTE (not used).
  64.  
  65. ----
  66.  
  67. Test mode:
  68.  
  69. 1)  Press player 2 buttons 1+2 during reset.  "Ready?" will appear
  70. 2)    Press player 1 buttons in this sequence:
  71.     2,2,2, 1,1,1, 2,2,2, 1,1,1
  72.     The release date of this program will appear.
  73.  
  74. Some code has to be patched out for this to work (see below). The program
  75. remaps button 2 and 3 to button 1, so you can't enter the above sequence.
  76.  
  77. ********************************************************************/
  78.  
  79.  
  80. #include "driver.h"
  81.  
  82. extern unsigned char *bjtwin_workram;
  83. extern unsigned char *bjtwin_spriteram;
  84. extern unsigned char *bjtwin_txvideoram;
  85. extern unsigned char *bjtwin_videocontrol;
  86. extern size_t bjtwin_txvideoram_size;
  87.  
  88.  
  89. READ_HANDLER( bjtwin_txvideoram_r );
  90. WRITE_HANDLER( bjtwin_txvideoram_w );
  91. WRITE_HANDLER( bjtwin_paletteram_w );
  92. WRITE_HANDLER( bjtwin_flipscreen_w );
  93.  
  94. int  bjtwin_vh_start(void);
  95. void bjtwin_vh_stop(void);
  96. void bjtwin_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh);
  97.  
  98.  
  99.  
  100. WRITE_HANDLER( bjtwin_oki6295_bankswitch_w )
  101. {
  102.     if ((data & 0x00ff0000) == 0)
  103.     {
  104.         switch (offset)
  105.         {
  106.             case 0x00:    OKIM6295_set_bank_base(0, 0, (data & 0x0f) * 0x10000);    break;
  107.             case 0x02:    OKIM6295_set_bank_base(0, 1, (data & 0x0f) * 0x10000);    break;
  108.             case 0x04:    OKIM6295_set_bank_base(0, 2, (data & 0x0f) * 0x10000);    break;
  109.             case 0x06:    OKIM6295_set_bank_base(0, 3, (data & 0x0f) * 0x10000);    break;
  110.             case 0x08:    OKIM6295_set_bank_base(1, 0, (data & 0x0f) * 0x10000);    break;
  111.             case 0x0a:    OKIM6295_set_bank_base(1, 1, (data & 0x0f) * 0x10000);    break;
  112.             case 0x0c:    OKIM6295_set_bank_base(1, 2, (data & 0x0f) * 0x10000);    break;
  113.             case 0x0e:    OKIM6295_set_bank_base(1, 3, (data & 0x0f) * 0x10000);    break;
  114.         }
  115.     }
  116. }
  117.  
  118.  
  119.  
  120. static struct MemoryReadAddress readmem[] =
  121. {
  122.     { 0x000000, 0x07ffff, MRA_ROM },
  123.     { 0x080000, 0x080001, input_port_0_r },
  124.     { 0x080002, 0x080003, input_port_1_r },
  125.     { 0x080008, 0x080009, input_port_2_r },
  126.     { 0x08000a, 0x08000b, input_port_3_r },
  127.     { 0x084000, 0x084001, OKIM6295_status_0_r },
  128.     { 0x084010, 0x084011, OKIM6295_status_1_r },
  129.     { 0x088000, 0x0887ff, paletteram_word_r },
  130.     { 0x094000, 0x09cdff, MRA_BANK2 },    /* BG RAM */
  131.     { 0x09ce00, 0x09ddff, bjtwin_txvideoram_r },
  132.     { 0x0f0000, 0x0fffff, MRA_BANK1 },    /* Work RAM */
  133.     { -1 }
  134. };
  135.  
  136. static struct MemoryWriteAddress writemem[] =
  137. {
  138.     { 0x000000, 0x07ffff, MWA_ROM },
  139.     { 0x080014, 0x080015, bjtwin_flipscreen_w },
  140.     { 0x084000, 0x084001, OKIM6295_data_0_w },
  141.     { 0x084010, 0x084011, OKIM6295_data_1_w },
  142.     { 0x084020, 0x08402f, bjtwin_oki6295_bankswitch_w },
  143.     { 0x088000, 0x0887ff, bjtwin_paletteram_w, &paletteram },
  144.     { 0x094000, 0x09cdff, MWA_BANK2, &bjtwin_videocontrol },    /* BG RAM */
  145.     { 0x09ce00, 0x09ddff, bjtwin_txvideoram_w, &bjtwin_txvideoram, &bjtwin_txvideoram_size },
  146.     { 0x0f0000, 0x0fffff, MWA_BANK1, &bjtwin_workram },    /* Work RAM */
  147.     { -1 }
  148. };
  149.  
  150.  
  151. INPUT_PORTS_START( bjtwin )
  152.     PORT_START        /* IN0 */
  153.     PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
  154.     PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
  155.     PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 )
  156.     PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
  157.     PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
  158.     PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )    /* shown in service mode, but no effect */
  159.     PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )    /* Maybe unused */
  160.     PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )    /* Maybe unused */
  161.  
  162.     PORT_START      /* IN1 */
  163.     PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER1 )
  164.     PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER1 )
  165.     PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER1 )
  166.     PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER1 )
  167.     PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER1 )
  168.     PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER1 )
  169.     PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN )
  170.     PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN )
  171.     PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 )
  172.     PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER2 )
  173.     PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER2 )
  174.     PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER2 )
  175.     PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
  176.     PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
  177.     PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN )
  178.     PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN )
  179.  
  180.     PORT_START    /* DSW A */
  181.     PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) )
  182.     PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
  183.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  184.     PORT_DIPNAME( 0x0e, 0x0e, "Starting level" )
  185.     PORT_DIPSETTING(    0x08, "  Germany" )
  186.     PORT_DIPSETTING(    0x04, " Thailand" )
  187.     PORT_DIPSETTING(    0x0c, "   Nevada" )
  188.     PORT_DIPSETTING(    0x0e, "    Japan" )
  189.     PORT_DIPSETTING(    0x06, "    Korea" )
  190.     PORT_DIPSETTING(    0x0a, "  England" )
  191.     PORT_DIPSETTING(    0x02, "Hong Kong" )
  192.     PORT_DIPSETTING(    0x00, "    China" )
  193.     PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) )
  194.     PORT_DIPSETTING(    0x20, "Easy" )
  195.     PORT_DIPSETTING(    0x30, "Normal" )
  196.     PORT_DIPSETTING(    0x10, "Hard" )
  197.     PORT_DIPSETTING(    0x00, "Hardest" )
  198.     PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Lives ) )
  199.     PORT_DIPSETTING(    0x00, "1" )
  200.     PORT_DIPSETTING(    0x40, "2" )
  201.     PORT_DIPSETTING(    0xc0, "3" )
  202.     PORT_DIPSETTING(    0x80, "4" )
  203.  
  204.     PORT_START    /* DSW B */
  205.     PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )
  206.     PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
  207.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  208.     PORT_DIPNAME( 0x02, 0x02, DEF_STR( Demo_Sounds ) )
  209.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  210.     PORT_DIPSETTING(    0x02, DEF_STR( On ) )
  211.     PORT_DIPNAME( 0x1c, 0x1c, DEF_STR( Coin_B ) )
  212.     PORT_DIPSETTING(    0x10, DEF_STR( 4C_1C ) )
  213.     PORT_DIPSETTING(    0x08, DEF_STR( 3C_1C ) )
  214.     PORT_DIPSETTING(    0x18, DEF_STR( 2C_1C ) )
  215.     PORT_DIPSETTING(    0x1c, DEF_STR( 1C_1C ) )
  216.     PORT_DIPSETTING(    0x0c, DEF_STR( 1C_2C ) )
  217.     PORT_DIPSETTING(    0x14, DEF_STR( 1C_3C ) )
  218.     PORT_DIPSETTING(    0x04, DEF_STR( 1C_4C ) )
  219.     PORT_DIPSETTING(    0x00, DEF_STR( Free_Play ) )
  220.     PORT_DIPNAME( 0xe0, 0xe0, DEF_STR( Coin_A ) )
  221.     PORT_DIPSETTING(    0x80, DEF_STR( 4C_1C ) )
  222.     PORT_DIPSETTING(    0x40, DEF_STR( 3C_1C ) )
  223.     PORT_DIPSETTING(    0xc0, DEF_STR( 2C_1C ) )
  224.     PORT_DIPSETTING(    0xe0, DEF_STR( 1C_1C ) )
  225.     PORT_DIPSETTING(    0x60, DEF_STR( 1C_2C ) )
  226.     PORT_DIPSETTING(    0xa0, DEF_STR( 1C_3C ) )
  227.     PORT_DIPSETTING(    0x20, DEF_STR( 1C_4C ) )
  228.     PORT_DIPSETTING(    0x00, DEF_STR( Free_Play ) )
  229.  
  230. INPUT_PORTS_END
  231.  
  232.  
  233.  
  234. static struct GfxLayout charlayout =
  235. {
  236.     8,8,    /* 8*8 characters */
  237.     2048,   /* 2048 characters */
  238.     4,      /* 4 bits per pixel */
  239.     { 0, 1, 2, 3 }, /* the bitplanes are packed in one nibble */
  240.     { 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4 },
  241.     { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
  242.     32*8   /* every char takes 32 consecutive bytes */
  243. };
  244.  
  245. static struct GfxLayout tilelayout =
  246. {
  247.     8,8,    /* 8*8 characters */
  248.     32768,  /* 32768 characters */
  249.     4,      /* 4 bits per pixel */
  250.     { 0, 1, 2, 3 }, /* the bitplanes are packed in one nibble */
  251.     { 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4 },
  252.     { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
  253.     32*8   /* every char takes 32 consecutive bytes */
  254. };
  255.  
  256. static struct GfxLayout spritelayout =
  257. {
  258.     16,16,   /* 16*16 sprites */
  259.     8192,    /* 8192 sprites */
  260.     4,       /* 4 bits per pixel */
  261.     { 0, 1, 2, 3 }, /* the bitplanes are packed in one nibble */
  262.     { 2*4, 3*4, 0*4, 1*4, 6*4, 7*4, 4*4, 5*4,
  263.         16*32+2*4, 16*32+3*4, 16*32+0*4, 16*32+1*4, 16*32+6*4, 16*32+7*4, 16*32+4*4, 16*32+5*4 },
  264.     { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32,
  265.         8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32 },
  266.     4*32*8   /* every sprites takes 256 consecutive bytes */
  267. };
  268.  
  269. static struct GfxDecodeInfo bjtwin_gfxdecodeinfo[] =
  270. {
  271.     { REGION_GFX1, 0, &charlayout,     0, 16 },    /* Chars */
  272.     { REGION_GFX2, 0, &tilelayout,     0, 16 },    /* Tiles */
  273.     { REGION_GFX3, 0, &spritelayout, 256, 16 },    /* Sprites */
  274.     { -1 } /* end of array */
  275. };
  276.  
  277.  
  278. static struct OKIM6295interface okim6295_interface =
  279. {
  280.     2,              /* 2 chip */
  281.     { 22050, 22050 },         /* 22050Hz frequency? */
  282. //    { 24000, 24000 },    /* this fixes pitch but music breaks up */
  283.     { REGION_SOUND1, REGION_SOUND2 },        /* memory region 2,3 */
  284.     { 50,50 }
  285. };
  286.  
  287.  
  288.  
  289. static struct MachineDriver machine_driver_bjtwin =
  290. {
  291.     /* basic machine hardware */
  292.     {
  293.         {
  294.             CPU_M68000,
  295.             16000000, /* ?? MHz ? */
  296.             readmem,writemem,0,0,
  297.             m68_level4_irq,1,
  298.             m68_level1_irq,102
  299.         },
  300.     },
  301.     60, DEFAULT_REAL_60HZ_VBLANK_DURATION,
  302.     1,
  303.     0,
  304.  
  305.     /* video hardware */
  306.     512, 256, { 0*8, 48*8-1, 2*8, 30*8-1 },
  307.     bjtwin_gfxdecodeinfo,
  308.     1024, 1024,
  309.     0,
  310.  
  311.     VIDEO_TYPE_RASTER | VIDEO_MODIFIES_PALETTE,
  312.     0,
  313.     bjtwin_vh_start,
  314.     bjtwin_vh_stop,
  315.     bjtwin_vh_screenrefresh,
  316.  
  317.     0,0,0,0,
  318.     {
  319.         {
  320.             SOUND_OKIM6295,
  321.             &okim6295_interface
  322.         }
  323.     }
  324. };
  325.  
  326.  
  327.  
  328. ROM_START( bjtwin )
  329.     ROM_REGION( 0x80000, REGION_CPU1 )        /* 68000 code */
  330.     ROM_LOAD_EVEN( "bjt.77",  0x00000, 0x40000, 0x7830A465 )    /* 68000 code */
  331.     ROM_LOAD_ODD ( "bjt.76",  0x00000, 0x40000, 0x7CD4E72A )    /* 68000 code */
  332.  
  333.     ROM_REGION( 0x010000, REGION_GFX1 | REGIONFLAG_DISPOSE )
  334.     ROM_LOAD( "bjt.35",        0x000000, 0x010000, 0xAA13DF7C )    /* 8x8 tiles */
  335.  
  336.     ROM_REGION( 0x100000, REGION_GFX2 | REGIONFLAG_DISPOSE )
  337.     ROM_LOAD( "bjt.32",        0x000000, 0x100000, 0x8A4F26D0 )    /* 16x16 tiles */
  338.  
  339.     ROM_REGION( 0x100000, REGION_GFX3 | REGIONFLAG_DISPOSE )
  340.     ROM_LOAD( "bjt.100",    0x000000, 0x100000, 0xBB06245D )    /* Sprites */
  341.  
  342.     ROM_REGION( 0x100000, REGION_SOUND1 )    /* 1Mb for ADPCM sounds - sound chip is OKIM6295 */
  343.     ROM_LOAD( "bjt.130",    0x000000, 0x100000, 0x372D46DD )
  344.  
  345.     ROM_REGION( 0x100000, REGION_SOUND2 )    /* 1Mb for ADPCM sounds - sound chip is OKIM6295 */
  346.     ROM_LOAD( "bjt.127",    0x000000, 0x100000, 0x8DA67808 )
  347. ROM_END
  348.  
  349.  
  350.  
  351. static unsigned char decode_byte(unsigned char src, unsigned char *bitp)
  352. {
  353.     unsigned char ret, i;
  354.  
  355.     ret = 0;
  356.     for (i=0; i<8; i++)
  357.         ret |= (((src >> bitp[i]) & 1) << (7-i));
  358.  
  359.     return ret;
  360. }
  361.  
  362. unsigned long bjtwin_address_map_bg0(unsigned long addr)
  363. {
  364.    return ((addr&0x00004)>> 2) | ((addr&0x00800)>> 10) | ((addr&0x40000)>>16);
  365. }
  366.  
  367.  
  368. static unsigned short decode_word(unsigned short src, unsigned char *bitp)
  369. {
  370.     unsigned short ret, i;
  371.  
  372.     ret=0;
  373.     for (i=0; i<16; i++)
  374.         ret |= (((src >> bitp[i]) & 1) << (15-i));
  375.  
  376.     return ret;
  377. }
  378.  
  379.  
  380. unsigned long bjtwin_address_map_sprites(unsigned long addr)
  381. {
  382.    return ((addr&0x00010)>> 4) | ((addr&0x20000)>>16);
  383. }
  384.  
  385.  
  386. void init_bjtwin(void)
  387. {
  388.     /* GFX are scrambled.  We decode them here.  (BIG Thanks to Antiriad for descrambling info) */
  389.     unsigned char *rom;
  390.  
  391.     static unsigned char decode_data_bg[8][8] =
  392.     {
  393.         {0x3,0x0,0x7,0x2,0x5,0x1,0x4,0x6},
  394.         {0x1,0x2,0x6,0x5,0x4,0x0,0x3,0x7},
  395.         {0x7,0x6,0x5,0x4,0x3,0x2,0x1,0x0},
  396.         {0x7,0x6,0x5,0x0,0x1,0x4,0x3,0x2},
  397.         {0x2,0x0,0x1,0x4,0x3,0x5,0x7,0x6},
  398.         {0x5,0x3,0x7,0x0,0x4,0x6,0x2,0x1},
  399.         {0x2,0x7,0x0,0x6,0x5,0x3,0x1,0x4},
  400.         {0x3,0x4,0x7,0x6,0x2,0x0,0x5,0x1},
  401.     };
  402.  
  403.     static unsigned char decode_data_sprite[4][16] =
  404.     {
  405.         {0x9,0x3,0x4,0x5,0x7,0x1,0xB,0x8,0x0,0xD,0x2,0xC,0xE,0x6,0xF,0xA},
  406.         {0x1,0x3,0xC,0x4,0x0,0xF,0xB,0xA,0x8,0x5,0xE,0x6,0xD,0x2,0x7,0x9},
  407.         {0xF,0xE,0xD,0xC,0xB,0xA,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x1,0x0},
  408.         {0xF,0xE,0xC,0x6,0xA,0xB,0x7,0x8,0x9,0x2,0x3,0x4,0x5,0xD,0x1,0x0},
  409.     };
  410.  
  411.  
  412.     int A,i;
  413.  
  414.  
  415.     /* background */
  416.     rom = memory_region(REGION_GFX2);
  417.     for (A = 0;A < memory_region_length(REGION_GFX2);A++)
  418.     {
  419.         rom[A] = decode_byte( rom[A], decode_data_bg[bjtwin_address_map_bg0(A)]);
  420.     }
  421.  
  422.     /* sprites */
  423.     rom = memory_region(REGION_GFX3);
  424.     for (A = 0;A < memory_region_length(REGION_GFX3);A += 2)
  425.     {
  426.         unsigned short tmp = decode_word( rom[A]*256 + rom[A+1], decode_data_sprite[bjtwin_address_map_sprites(A)]);
  427.         rom[A] = tmp >> 8;
  428.         rom[A+1] = tmp & 0xff;
  429.     }
  430.  
  431.  
  432.     /*    Bombjack Twin uses different banks for each voice of each OKI chip
  433.      *    Each bank is 0x10000 bytes long, but 24 bit data stored in OKI rom header
  434.      *    is invalid.  So we void the highest bits of address here.
  435.      */
  436.  
  437.     rom = memory_region(REGION_SOUND1);    /* Process OKI 1 ROM */
  438.     for (i=0; i < 0x10; i++)
  439.     {
  440.         for (A=0; A < 0x400; A += 8)
  441.         {
  442.             rom[i*0x10000+A] = 0;
  443.             rom[i*0x10000+A+3] = 0;
  444.         }
  445.     }
  446.  
  447.     rom = memory_region(REGION_SOUND2);    /* Process OKI 2 ROM */
  448.     for (i=0; i < 0x10; i++)
  449.     {
  450.         for (A=0; A < 0x400; A += 8)
  451.         {
  452.             rom[i*0x10000+A] = 0;
  453.             rom[i*0x10000+A+3] = 0;
  454.         }
  455.     }
  456.  
  457.  
  458.     /* Patch rom to enable test mode */
  459.  
  460. /*    008F54: 33F9 0008 0000 000F FFFC move.w  $80000.l, $ffffc.l
  461.  *    008F5E: 3639 0008 0002           move.w  $80002.l, D3
  462.  *    008F64: 3003                     move.w  D3, D0                \
  463.  *    008F66: 3203                     move.w  D3, D1                |    This code remaps
  464.  *    008F68: 0041 BFBF                ori.w   #-$4041, D1        |   buttons 2 and 3 to
  465.  *    008F6C: E441                     asr.w   #2, D1                |   button 1, so
  466.  *    008F6E: 0040 DFDF                ori.w   #-$2021, D0        |   you can't enter
  467.  *    008F72: E240                     asr.w   #1, D0                |   service mode
  468.  *    008F74: C640                     and.w   D0, D3                |
  469.  *    008F76: C641                     and.w   D1, D3                /
  470.  *    008F78: 33C3 000F FFFE           move.w  D3, $ffffe.l
  471.  *    008F7E: 207C 000F 9000           movea.l #$f9000, A0
  472.  */
  473.  
  474. //    rom = memory_region(REGION_CPU1);
  475. //    WRITE_WORD(&rom[0x09172], 0x6006);    /* patch checksum error */
  476. //    WRITE_WORD(&rom[0x08f74], 0x4e71);
  477. }
  478.  
  479.  
  480.  
  481. GAME( 1993, bjtwin, 0, bjtwin, bjtwin, bjtwin, ROT270, "NMK", "Bombjack Twin" )
  482.